iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1

今天是延續昨天的 Hooks 探索,要學習的是 useReduceruseCallbackuseMemouseRef

就讓我們來看看這些 Hooks 可以帶給我們怎麼樣更簡便的使用方式吧!

useReducer

在前面的天數我們學習到了 Redux 的使用,如果能夠理解的話,相信 useReducer 使用起來就不會那麼陌生。

因為 useReducer 會回傳一個 statedipatch 的方法,然後就跟 Redux 一樣透過 dispatch 一個 action 來更新 state 中的狀態。

這裡我們來看看官方提供的範例程式碼:

const initialState = {count: 0};

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}

上方的程式碼是一個簡單的加減計數器,可以執行加一、減一的操作。

而基本上設定 statedipatch 一個 action 到 reducer 更新 state 的狀態,根本和使用 Redux 沒什麼差異。

不過有一個小細節需要注意的部分是, initialState 原本在 Redux 中會作為 reducer 的預設值,而使用 useReducer 的話,則是將 initialState 當作第二個參數傳入

useCallback

useCallback 會回傳傳入的 callback function 的 memoized 版本,讓這個 callback 只會在依賴改變時才會更新。

而這麼做的原因在於要避免不必要的 render,優化效能。

這裡來看看官方提供的一個示意程式碼:

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

callback function 傳入一個 doSomething 方法,而這個方法會在當 a, b 發生改變時才會執行。

useMemo

useMemo 使用方式與 useCallback 類似,都是為了優化效能,但是其 memoized 的是一個值,而且需要注意的是 useMemo 的 function 是在 render 期間執行,所以避免在 render 期間處理 side effect。

useRef

今天的最後要學習的是 useRef,如果還記得第十四天的createRef 學起來,focus 元素不麻煩,那這個部分也不會太難理解,因為 useRef 可以讓我們在 function component 中更簡單的 focus 元素。

直接來看看底下這個例子:

相關測試範例,點擊前往

import React, { useRef } from "react";
import "./styles.css";

export default function App() {
  const myRef = useRef(null);

  const focusInputByUseRef = () => {
    myRef.current.focus();
  };

  return (
    <div className="App">
      <h2 onClick={focusInputByUseRef}>
        functional Componet: useRef - 點擊本段文字
      </h2>
      <input ref={myRef} />
    </div>
  );
}

useRef 中傳初始值傳入 null 是告訴 React 目前在一開始時還沒有任何 ref 依附在 React element 中,而之後當我們在元素中設定 ref 時,此時就會拿到這個元素了。

今天學習了 React Hooks 中的 useReduceruseCallbackuseMemo 以及 useRef 的基礎概念。

明天再繼續探索其他的 Hooks吧!

鐵人賽文章與程式碼同步發佈於:

  1. 個人部落格
  2. Github

資源


上一篇
認識 React Hooks 之一
下一篇
認識 React Hooks 之三
系列文
與 React 交朋友的三十天學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言